using System;
using LocalOverride.Fiddler.Store;
using NSubstitute;
using NUnit.Framework;

namespace LocalOverride.Tests.Store
{
    [TestFixture]
    public class MappingStoreTests
    {

        [Test]
        public void CanCreateMappingStore()
        {
            GetStore();
        }

        private MappingStore GetStore()
        {
            var localFileAccess = Substitute.For<ILocalFileAccess>();
            return new MappingStore(localFileAccess);
        }

        [Test]
        public void Save_WithNoEntriesAdded_ReturnsNoError()
        {
            IMappingStore mappingStore = GetStore();
            mappingStore.Persist();
        }

        [Test]
        public void Save_WithOneEntryAdded_ReturnsNoError()
        {
            IMappingStore mappingStore = GetStore();

            mappingStore.AddEntry(GetSampleMappingEntry());

            mappingStore.Persist();
        }

        [Test]
        public void SavedEntry_IsPersisted()
        {
            IMappingStore mappingStore = GetStore();

            MappingEntry mappingEntry = GetSampleMappingEntry();
            mappingStore.AddEntry(mappingEntry);

            mappingStore.Persist();

            IMappingStore reloadedStore = GetStore();

            var entries = reloadedStore.Entries;
            CollectionAssert.Contains(entries, mappingEntry);
        }

        [Test]
        public void DeletedEntry_IsRemoved()
        {
            IMappingStore mappingStore = GetStore();
            mappingStore.Clear();
            mappingStore.Persist();

            MappingEntry mappingEntry = GetSampleMappingEntry();
            mappingStore.AddEntry(mappingEntry);

            mappingStore.Persist();

            IMappingStore reloadedAfterAdd = GetStore();
            reloadedAfterAdd.RemoveEntry(mappingEntry);
            reloadedAfterAdd.Persist();

            IMappingStore reloadedAfterDelete = GetStore();
            var entries = reloadedAfterDelete.Entries;
            CollectionAssert.DoesNotContain(entries, mappingEntry);
        }

        [Test]
        public void Clear_RemovesEntries()
        {
            IMappingStore mappingStore = GetStore();
            MappingEntry mappingEntry = GetSampleMappingEntry();
            mappingStore.AddEntry(mappingEntry);
            mappingStore.Persist();

            IMappingStore storeToClear = GetStore();
            storeToClear.Clear();
            storeToClear.Persist();

            IMappingStore reloadedStore = GetStore();
            var entries = reloadedStore.Entries;
            CollectionAssert.DoesNotContain(entries, mappingEntry);
        }

        private MappingEntry GetSampleMappingEntry()
        {
            var sampleMappingEntry = new MappingEntry
                                         {
                                             LocalPath = Guid.NewGuid().ToString(),
                                             Url = Guid.NewGuid().ToString(),
                                             IsDirectory = true,
                                             DownloadLocalCopy = true,
                                             DefaultFileName = "default.html",
                                         };

            sampleMappingEntry.FileExtensions.Add("css");
            sampleMappingEntry.FileExtensions.Add("js");

            sampleMappingEntry.SpecialCaseMappings.Add(new SpecialCaseMapping { LocalPath = "Blah", Url = "http://blah.blah.blah" });
            return sampleMappingEntry;
        }
    }
}